package com.weiss.dataredis.redis.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;

import java.net.UnknownHostException;

// 注册为configuration
//@Configuration 注解用于定义一个配置类，它告诉 Spring 容器这是一个配置类，类似于传统的 XML 配置文件的作用。
//作用
//
//    定义配置类：用于声明一个类是 Spring 的配置类。
//    替代 XML 配置：通过注解的方式替代传统的 XML 配置文件，使配置更加简洁和易于管理。
//    包含多个 @Bean 方法：可以在 @Configuration 类中定义多个 @Bean 方法，用于声明和初始化 Bean。
@Configuration
public class RedisConfig {

    //@Bean 注解用于在方法上，表示该方法会返回一个 Bean 实例，并将其注册到 Spring 容器中。
    //作用
    //
    //    声明 Bean：用于声明一个方法返回的对象是一个 Bean，并将其注册到 Spring 容器中。
    //    配置 Bean 的生命周期：可以通过方法的返回值类型和参数来配置 Bean 的生命周期和依赖关系。
    //    替代 <bean> 标签：在注解配置中替代 XML 配置文件中的 <bean> 标签。
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        // 创建template
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        // 设置连接工厂
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // 设置序列化工具
        // 需要在pom.xml文件中引入jackson依赖
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        // key和hashKey采用string序列化
        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setHashKeySerializer(RedisSerializer.string());
        // value和hashValue采用JSON序列化
        redisTemplate.setValueSerializer(jsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jsonRedisSerializer);
        return redisTemplate;
    }
}
